


import AnaliseLexicaFinal.gui.Funcoes.numereBorder;
import AnaliseLexicaFinal.gui.Funcoes.Arquivo;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.LinkedList;

import javax.swing.*;

import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.estruturadados.ErroSintatico;

import AnaliseLexicaFinal.Analise.AnalisadorLexico;
import AnaliseLexicaFinal.EstruturaDeDados.ErroLexico;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;

import java.util.ArrayList;

public class Interface extends JFrame{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	JTextArea codigoTexto, listaTokens, listaErro;
	
	
	public Interface(){
		
		super("Compilador");
		
		Container janela = getContentPane();
		
		janela.setLayout(null);
						
		JLabel codigo = new JLabel("Codigo-fonte");
		
		codigo.setBounds(12, 35, 80, 20);
		janela.add(codigo);
		
		JLabel tokenLista = new JLabel("Lista de Tokens");
		tokenLista.setBounds(815, 35, 100, 20);
                janela.add(tokenLista);
		
		JLabel erro = new JLabel("Lista de Erros (Lexicos, Sintaticos e Semanticos)");
		erro.setBounds(12, 520, 280, 20);
		janela.add(erro);
		
		final JTextArea codigoTexto = new JTextArea();
		codigoTexto.setColumns(20);
		codigoTexto.setRows(5);
                codigoTexto.setBorder(new numereBorder());
		
		//codigoTexto.setColumns(40);
		//codigoTexto.setRows(5);
		JScrollPane scroolCodigo = new JScrollPane(codigoTexto, 
									   JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
									   JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
				
		//janela.add(new JScrollPane(codigoTexto));
		scroolCodigo.setViewportView(codigoTexto);
		scroolCodigo.setBounds(10,60,500,450);
		janela.add(scroolCodigo);		
		
		final JTextArea listaTokens = new JTextArea();
		//listaTokens.setBounds(580, 60, 330, 450);
		listaTokens.setColumns(20);
		listaTokens.setRows(5);
		janela.add(listaTokens);
		listaTokens.setEditable(false);

		JScrollPane scroolLista = new JScrollPane(listaTokens,
									  JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
									  JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		scroolLista.setViewportView(listaTokens);
		scroolLista.setBounds(560, 60, 350, 450);
		janela.add(scroolLista);
		
		
		final JTextArea listaErro = new JTextArea();
		//listaErro.setBounds(10, 540, 900, 130);//eixo X, eixo Y, comprimento, altura
		listaErro.setColumns(20);
		listaErro.setRows(5);
		janela.add(listaErro);
		listaErro.setEditable(false);

		JScrollPane scroolErro = new JScrollPane(listaErro,
									 JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
									 JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		scroolErro.setViewportView(listaErro);
		scroolErro.setBounds(10, 540, 900, 130);//eixo X, eixo Y, comprimento, altura
		janela.add(scroolErro);
       

		JButton botao = new JButton("Compilar codigo");

		botao.setBounds(400, 15, 138, 20);
		botao.addActionListener(
				
				new ActionListener(){
					
					public void actionPerformed(ActionEvent evento){
                        listaTokens.setText(""); //Limpar as areas de texto
                        listaErro.setText(""); //Limpar as areas de texto
                        listaErro.setForeground(Color.RED); // setar area de texto fonte vermelha

                        AnalisadorLexico gerente = new AnalisadorLexico();
                        gerente.buscarTokens(codigoTexto.getText());
                        LinkedList<LinkToken> tokens = gerente.tokens;
                        
                        LinkedList<LinkToken> tokens2 = new LinkedList<LinkToken>();
                        tokens2.addAll(tokens);
                        
                        ArrayList<ErroSemantico> eSemantico;
                        
                        LinkToken a = new LinkToken(" ", " ", 0);
                    	tokens2.add(a);
                    	
                    	LinkToken b = new LinkToken(" ", " ", 0);
                    	tokens2.add(b);
                    	
                    	LinkToken c = new LinkToken(" ", " ", 0);
                    	tokens2.add(c);
                    	
                        LinkedList<ErroLexico> erroslexicos = gerente.erros;
                        
                        
                    	if (erroslexicos.size() == 0){
                            
                        	AnalisadorSintatico asintatico = new AnalisadorSintatico(tokens2);
                                                        	
                        	asintatico.analisar();
                        	eSemantico = AnalisadorSintatico.errosemanticos;
                        	
                        	if (asintatico.erros == null) {
                                //listaErro.setForeground(Color.blue); // setar area de texto fonte azul

                                if (eSemantico.size() == 0) {
                                    listaErro.insert("Codigo compilado com sucesso!", 0);
                                    listaErro.insert("-----------------------------------------------------\n", 0);
                                    listaErro.insert("Nao foram encontrados erros semanticos\n", 0);
                                } else {
                                	while(eSemantico.size() != 0){
                                    	ErroSemantico errosemantico = eSemantico.remove(eSemantico.size() - 1);
                                    	listaErro.insert("Erro: " + errosemantico.getErro() + "      " + "Linha: " + errosemantico.getLinha() + "\n", 0);
                                    }
                                	
                                }
                                
                                listaErro.insert("Erros Semanticos:\n\n", 0);
                                listaErro.insert("-----------------------------------------------------\n", 0);
                                listaErro.insert("Nao foram encontrados erros sintaticos\n", 0);

                            } else {
                                    
                                    listaErro.insert("Analise Semantica nao efetuada, pois existem erros sintaticos", 0);
                        	
                            	ErroSintatico token = asintatico.erros;
                            	listaErro.insert("Erro: " + token.getErro() + "      " + "Linha: " + token.getLinha()
                            			+ "\t"+"Correto: " + token.getCorreto()+ "\n", 0);
                            }
                                                        
                        }else
                        		listaErro.insert("Analise Sintatica nao efetuada, pois existem erros lexicos", 0);
                        
                        listaErro.insert("Erros Sintaticos:\n\n", 0);
                        listaErro.insert("-----------------------------------------------------\n", 0);
                        
                        while(tokens.size() != 0){
                        	LinkToken token = tokens.removeLast();
                        	listaTokens.insert(token.getToken()+":      "+token.getLexema().trim() + "\n", 0);
                        }
                        
                        if(erroslexicos.size() == 0){
                            listaErro.setForeground(Color.blue); // setar area de texto fonte azul
                            listaErro.insert("Nao foram encontrados erros lexicos\n", 0);
                        }
                        
                        while(erroslexicos.size() != 0){
                        	ErroLexico erro = erroslexicos.removeLast();
                        	listaErro.insert("Erro: " + erro.getToken() + "\t" + "Linha: " + erro.getLinha()
                        			+ "\t"+"Motivo: " + erro.getMotivo()+ "\n", 0);
                        }
                        
                        listaErro.insert("Erros Lexicos:\n\n", 0);
                        
                                      
                    }
                });
		
		janela.add(botao);
				
		JMenu menu = new JMenu("Arquivo");
		menu.setMnemonic('A');
				
		JMenuItem abrir = new JMenuItem("Abrir");
		abrir.setMnemonic('b');
		menu.add(abrir);
		abrir.addActionListener(
				new ActionListener(){
					
					public void actionPerformed(ActionEvent evento){
                        if(evento.equals(0)){
                            JFileChooser file = new JFileChooser();
                            if(file.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
							File arquivo = file.getSelectedFile();

							Arquivo lendoArquivo = new Arquivo();
							String novoArquivo = lendoArquivo.LerArquivo(arquivo);
							codigoTexto.insert(novoArquivo, 0);

						}

                        }
                        if(!evento.equals(0)){
                            codigoTexto.setText("");
                            JFileChooser file = new JFileChooser();
                            if(file.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
							File arquivo = file.getSelectedFile();

							Arquivo lendoArquivo = new Arquivo();
							String novoArquivo = lendoArquivo.LerArquivo(arquivo);
							codigoTexto.insert(novoArquivo, 0);

						}

                        }

						
					}
				}
		);
		
		
		
		JMenuItem sair = new JMenuItem("Sair");
		sair.setMnemonic('i');
		menu.add(sair);
		sair.addActionListener(
				
				new ActionListener(){
					public void actionPerformed(ActionEvent evento){
						System.exit(0);
					}
				}
		);

		JMenu menuAjuda = new JMenu("Ajuda");
		menuAjuda.setMnemonic('j');
				
		JMenuItem sobre = new JMenuItem("Sobre");
		sobre.setMnemonic('r');
		menuAjuda.add(sobre);

		JMenuBar barra = new JMenuBar();
		setJMenuBar(barra);
		barra.add(menu);
		barra.add(menuAjuda);
        sobre.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent evento){

                            mensageminformativa();
					}

               }

        );

		setSize(930,750);
		setVisible(true);
		setLocationRelativeTo(null);
		
	}
    public void mensageminformativa(){
       Icon seta_90 = new ImageIcon( "src/figuras/seta_90.gif" );
       JOptionPane.showMessageDialog(this, "Versão 1.0\n\n" +
                                      "Implementação de um Analisador Léxico realizado por uma equipe de estudantes\n" +
                                      "do curso de Engenharia de Computação da UEFS\n\n" +
                                            "Equipe:\n" +
                                            "André Luiz\n" +
                                            "Anderson Marques\n" +
                                            "Carlos Roberto\n"+
                                            "Edney\n" +
                                            "Elison\n" +
                                            "Ivo Romario\n" +
                                            "Linton Esteves\n" +
                                            "Matheus Araujo\n" +
                                            "Nathalia", "Analisador Léxico", JOptionPane.PLAIN_MESSAGE, seta_90  );
    }

   
      
    
		
	public static void main(String[] args) {
		Interface aplicacao = new Interface();
		aplicacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
}